package org.muyu.example1;

import org.muyu.example1.component.TxtBuilder;
import org.muyu.example1.component.XmlBuilder;
import org.muyu.example1.component.ExportDataModel;
import org.muyu.example1.component.ExportFooterModel;
import org.muyu.example1.component.ExportHeaderModel;
import org.muyu.example1.component.Director;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * 创建型模式 => 生成器模式实例【标准版】
 *
 * 组成部件
 * 1. 生成器接口【Builder】
 * 2. 具体的生成器实现【ConcreteBuilder】 => TxtBuilder、XmlBuilder
 * 3. 指导者【Director】
 * 4. 产品【Product】 => TxtBuilder、XmlBuilder中的buffer相当于产品；ExportHeaderModel、ExportDataModel、ExportFooterModel相当于产品的组成要素
 *
 * 将一个复杂对象的构建与它的表示分离，使得同样地构建过程可以创建不同的表示
 *
 * 案例理解
 * 最终输出的文本就相当于一个复杂对象，它通过header、body、foot三部分组成，并且最终需要有xml、txt的呈现结果
 * TxtBuilder中定义了，如果想呈现txt，header、body、foot分别应该如何去实现
 * Director则定义了一个统一的构建过程，即先渲染header、再渲染body、最后渲染foot
 * 通过生成器模式，Director的构建和ConcreteBuilder进行了分离，如果有新的呈现方式只需要增加新的生成器实现类即可，如果构建过程发生了调整，也只需要修改Director
 */
public class Client {

    public static void main(String[] args) {

        //准备测试数据
        ExportHeaderModel ehm = new ExportHeaderModel();
        ehm.setDepId("一分公司").setExportDate("2010-05-18");

        Map<String, Collection<ExportDataModel>> mapData = new HashMap<>();
        Collection<ExportDataModel> col = new ArrayList<>();
        ExportDataModel edm1 = new ExportDataModel();
        edm1.setProductId("产品001号").setPrice(100).setAmount(80);
        ExportDataModel edm2 = new ExportDataModel();
        edm1.setProductId("产品002号").setPrice(99).setAmount(55);

        //把数据组装起来
        col.add(edm1);
        col.add(edm2);
        mapData.put("销售记录表", col);

        ExportFooterModel efm = new ExportFooterModel();
        efm.setExportUser("张三");

        //相同的生产要素 ehm、mapData、efm，输出为文本文件
        TxtBuilder txtBuilder = new TxtBuilder();
        Director director = new Director(txtBuilder);
        director.construct(ehm, mapData, efm);
        System.out.println("输出到文本文件的内容：\n" + txtBuilder.getResult() + "\n");


        //相同的生产要素 ehm、mapData、efm，输出为xml文件
        XmlBuilder xmlBuilder = new XmlBuilder();
        Director director2 = new Director(xmlBuilder);
        director2.construct(ehm, mapData, efm);
        System.out.println("输出到XML文件的内容：\n" + xmlBuilder.getResult() + "\n");
    }
}
